package org.smart4j.framework.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * description: 反射工具类
 * @version v1.0
 * @author w
 * @date 2018年8月28日下午10:23:36
 */
public final class ReflectUtil {
	@SuppressWarnings("unused")
	private ReflectUtil reflect = new ReflectUtil();
	
	private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class);
	
	/**
	 * description: 创建类的实例 object
	 * @param clzz
	 * @return
	 * Object
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:30:29
	 */
	public static Object newInstanse(Class<?> clzz){
		try {
			return clzz.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
			logger.error("new instanse failure",e);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			logger.error("new instanse failure",e);
		}
		return null;
	}
	
	/**
	 * description: 根据类名Object  创建类的实例 
	 * @param className
	 * @return Object
	 * @version v1.0
	 * @author w
	 * @date 2018年11月4日 下午8:50:44
	 */
	public static Object newInstanse(String className){
		return newInstanse(ClassUtil.loadClass(className));
	}
	
	/**
	 * description: 调用方法
	 * @param obj 对象实例
	 * @param method 方法对象
	 * @param args 方法参数
	 * @return
	 * Object
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:31:53
	 */
	public static Object invokeMethod(Object obj,Method method,Object... args){
		try {
			method.setAccessible(true);
			Object result = method.invoke(obj, args);
			method.setAccessible(false);
			return result ;
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * description: 设置成员变量的值
	 * @param obj
	 * @param field
	 * @param value
	 * void
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:35:46
	 */
	public static void setField(Object obj,Field field,Object value){
		try {
			field.setAccessible(true);
			field.set(obj, value);
			field.setAccessible(false);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	
	
}
